--[[
	每个节点(node) 都有的 router 的基类
	同时也可以作为一个service的简单基类
	这里就不修改 routerbase这样的名字了，因为他的基本，或则最重要的是用作router
	理解了router的作用，再理解作为普通的service，也就非常简单了。
]]

local filename = "roterbase.lua"

local skynet = require "skynet"

local filelog = require "filelog"

require "pubenum"

local RouterBase = {
	CMD = {}
}

function RouterBase:new(obj)
    obj = obj or {}
    setmetatable(obj, self)
    self.__index = self
    self.__newindex = self
    return obj
end

function RouterBase:start()
	skynet.dispatch("lua", 
		function (session, source, command, ...)
			local f = RouterBase.CMD[command]
			local status = true, result 
			if f == nil then
				filelog.sys_error(filename.." CMD[command] is nil : ", command, ...)
				result = {retcode = EErrCode.ERR_INVALID_REQUEST, retstr = "request error"}
			else
				status, result = skynet.pcall(f, ... )
				if not status then
					filelog.sys_error(filename.." CMD[command] skynet.pcall failed : ", command, result, ...)
				end
			end
			skynet.retpack(result)
		end)
	self:init()
	-- skynet.error("service cmd func list: ")
	-- for k,v in pairs(RouterBase.CMD) do
	-- 	skynet.error("  -- " .. k)
	-- end
end

-- 使用子目录的格式，不要添加 .lua 后缀
function RouterBase:add_func(luafilename)
	local cmd = require(luafilename)

	 -- cmd的func中，如果需要调用上层route的数据，就需要添加init函数，把本service 赋值到 cmd 模块中去
	 --[[
	 	total example
	 	
	 	router file :
		------------------------------------------------------------
		local routerbase = require "routerbase"

		local Router = routerbase:new({xxx=123})

		function  Router:init()
			self:add_func("nodemsg/test")
		end

		skynet.start(function()
			Router:start()
		end)
		------------------------------------------------------------

		cmd func file:
		------------------------------------------------------------
		local CMD= {}
		local service = nil 
		function CMD.init(caller)
			filelog.print("line6", caller)
			service = caller	--这里的caller ，就是上层的router了, 
								--参数不用server，是字面理解上容易和变量server混淆
		end

		function CMD.functest()
			print(service.xxx)
		end

		return CMD	
		------------------------------------------------------------

		调用例子：
		skynet.call(".router", "lua", "functest")

	]]
	if cmd.init then
		cmd.init(self)
	end

	for funcname,func in pairs(cmd) do
		if RouterBase.CMD[funcname] ~= nil and funcname ~= "init" then
			skynet.error("cmd function : " .. luafilename .. "@" .. funcname .. " define again")
			skynet.abort()
			return nil
		end
		if type(func) == "function"  and funcname ~= "init" then
			RouterBase.CMD[funcname] = func
		end
	end
end

-- 这里添加命令， 简单的命令，可以直接写在本文件
function  RouterBase:init()
	-- self:add_func("routermsg/hello")
end

--[[
function RouterBase.CMD.func( ... )
	do somthing
end
]]

return RouterBase

